home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / defoma / libconsole.pl < prev    next >
Text File  |  2006-06-17  |  7KB  |  322 lines

  1. use POSIX;
  2.  
  3. my $dialog = '/usr/bin/whiptail';
  4. $dialog = '/usr/bin/dialog' unless (-x $dialog);
  5.  
  6. # code from dialog.pl(return_output)
  7. sub safe_redirect {
  8.     pipe(PARENT_READER, CHILD_WRITER);
  9.     my $pid = fork();
  10.     if ($pid == 0) {
  11.     close(PARENT_READER);
  12.     dup2(fileno(CHILD_WRITER),3);
  13.     open(STDOUT, ">&STDERR");
  14.     exec(@_);
  15.     die("exec failure: $_[0]");
  16.     }
  17.  
  18.     my $ret = '';
  19.     if ($pid > 0) {
  20.     close(CHILD_WRITER);
  21.     $ret .= <PARENT_READER>;
  22.     close(PARENT_READER);
  23.     waitpid($pid, 0);
  24.     $result = $?; #GLOBAL Variable: result
  25.     }
  26.  
  27.     return $ret;
  28. }
  29.  
  30. sub linecount {
  31.     my $text = shift;
  32.     my $lines = 0;
  33.     my $cnt = 0;
  34.     my @words = split(/ /, $text);
  35.     my($i, $len, $space);
  36.  
  37.     foreach $i (@words) {
  38.     if ($i eq '\n') {
  39.         $cnt = 0;
  40.         next;
  41.     }
  42.     
  43.     $len = length($i);
  44.     while (1) {
  45.         $lines++ if ($cnt == 0);
  46.         $space = ($cnt > 0);
  47.         
  48.         if ($cnt + $space + $len > $DWIDTH) {
  49.         if ($cnt == 0) {
  50.             $len -= $DWIDTH;
  51.         } else {
  52.             $cnt = 0;
  53.         }
  54.         } else {
  55.         $cnt += $len;
  56.         last;
  57.         }
  58.     }
  59.     }
  60.  
  61.     return $lines;
  62. }
  63.  
  64. # code from pppconfig.
  65. #
  66. #   Copyright (C) 1999 John G. Hasler (john@dhh.gt.org)
  67. #
  68. #   This program is free software; you can redistribute it and/or modify
  69. #   it under the terms of the GNU General Public License as published by
  70. #   the Free Software Foundation; either version 2 of the License, or
  71. #   (at your option) any later version.
  72.  
  73. sub dialogbox(@) {
  74.   my $type=shift(@_);
  75.   my $optionstr = (@_ > 0) ? shift(@_) : '';
  76.   my @vars=@_;
  77.   my $text=shift( @vars );
  78.   my $height = shift( @vars );
  79.   my $title = $DIALOGTITLE;
  80.  
  81.   my @options = split(' ', $optionstr) if ($optionstr ne '');
  82.  
  83. #  $result = callsystem_output('2>&1', '/usr/bin/dialog', '--clear', '--title',
  84. #                  $title, @options, $type, $text, $height, 80,
  85. #                  @vars);
  86. #  my $item=$output;
  87. #  chomp $item; # For gdialog, which returns strings with newlines.
  88.  
  89.   my $item = safe_redirect($dialog, '--output-fd', '3', '--clear', '--title',
  90.                $title, @options, $type, $text, $height, 80, @vars);
  91.   
  92.   $result = ($result >> 8);
  93.   exitfunc(255) if ($result == 255);
  94.   exitfunc(255, "Internal error") unless($result == 0 || $result == 1);
  95.   return $item;
  96. }
  97.  
  98. sub msgbox(@) {
  99.     my $text = shift;
  100.     my $lines = linecount($text);
  101.     $lines += 7;
  102.  
  103.     dialogbox("\-\-msgbox", '', $text, $lines);
  104.  
  105.     return $result;
  106. }
  107.  
  108. sub infobox(@) {
  109.     my $text = shift;
  110.     my $lines = linecount($text);
  111.     $lines += 7;
  112.  
  113.     dialogbox("\-\-infobox", '', $text, $lines);
  114.  
  115.     return $result;
  116. }
  117.  
  118. sub yesnobox(@) {
  119.     my $text = shift;
  120.     my $lines = linecount($text);
  121.     $lines += 7;
  122.     
  123.     dialogbox( "\-\-yesno", '', $text, $lines);
  124.  
  125.     return $result;
  126. }
  127.  
  128. sub inputbox(@) {
  129.     my $text = shift;
  130.     my $default = shift;
  131.     my $pattern = shift;
  132.     my $allowempty = shift;
  133.     my $lines = linecount($text);
  134.     my @args;
  135.     my $ret;
  136.     $lines += 7;
  137.  
  138.     while(1) {
  139.     @args = ();
  140.     push(@args, $text);
  141.     push(@args, $lines);
  142.     push(@args, $default) if ($default ne '');
  143.     
  144.     $ret = dialogbox( "\-\-inputbox", '', @args);
  145.  
  146.     return '' if ($result != 0);
  147.     return '' if ($ret eq '' && $allowempty != 0);
  148.     return $ret if ($ret =~ /^$pattern+$/);
  149.  
  150.     if ($ret eq '') {
  151.         $text = "Empty is not allowed.";
  152.     } else {
  153.         $default = $ret;
  154.         $ret =~ s/$pattern//g;
  155.         $default =~ s/[^$ret]/_/g;
  156.         $text = "Illegal characters: \"$ret\".";
  157.         if ($ret =~ / /) {
  158.         $text .= "\n you can use underscore in place of space.";
  159.         }
  160.     }
  161.     $lines = 8;
  162.     }
  163. }
  164.  
  165. sub menu(@) {
  166.     my $text = shift( @_ );
  167.     my $menu_height = shift( @_ );
  168.     my $options = shift;
  169.     my $lines = linecount($text);
  170.     $lines += 6 + $menu_height;
  171.     
  172.     return dialogbox( '--menu', $options, $text, $lines, $menu_height, @_ );
  173. }
  174.  
  175. sub menu_single(@) {
  176.     my $text = shift;
  177.     my $menu_height = shift;
  178.     my $options = shift;
  179.     my $lines = linecount($text);
  180.     $lines += 6 + $menu_height;
  181.     
  182.     my @args = @_;
  183.     my @pass = ();
  184.     my $i;
  185.  
  186.     for ($i = 0; $i < @args; $i++) {
  187.     if ($args[$i] ne '') {
  188.         $pass[$i * 2] = $args[$i];
  189.         $pass[$i * 2 + 1] = ' ';
  190.     }
  191.     }
  192.  
  193.     return dialogbox( '--menu', $options, $text, $lines, $menu_height,
  194.               @pass );
  195. }
  196.  
  197. sub checklist_single_onargs(@) {
  198.     my $text = shift( @_ );
  199.     my $menu_height = shift( @_ );
  200.     my $onargs = shift;
  201.     my $lines = linecount($text);
  202.     $lines += 6 + $menu_height;
  203.     
  204.     my @args = @_;
  205.     my @pass = ();
  206.     my $i;
  207.     my $j;
  208.     my @ons = split(' ', $onargs);
  209.  
  210.     for ($i = $j = 0; $i < @args; $i++) {
  211.     if ($args[$i] ne '') {
  212.         $pass[$j++] = $args[$i];
  213.         $pass[$j++] = ' ';
  214.         $pass[$j++] = (grep($_ eq $args[$i], @ons)) ? 'on' : 'off';
  215.     }
  216.     }
  217.     
  218.     return dialogbox('--checklist', '--separate-output', $text, $lines,
  219.              $menu_height, @pass );
  220. }
  221.  
  222. $INPUTCOMMON_MENU = 1;
  223.  
  224. sub input_menu {
  225.     my $input_text = shift;
  226.     my $default = shift;
  227.     my $input_pattern = shift;
  228.     my $input_allowempty = shift;
  229.     my $input_menu_item = '';
  230.     my $menu_text = '';
  231.     my @menu_list = ();
  232.     if (@_ >= 3) {
  233.     $input_menu_item = shift;
  234.     $menu_text = shift;
  235.     @menu_list = @_;
  236.     }
  237.  
  238.     while (1) {
  239.     if (@menu_list > 0) {
  240.         chomp($menu_text);
  241.         my $lines = 1;
  242.         while ($menu_text =~ /\n/m) {
  243.         $menu_text =~ s/\n/\\n/m;
  244.         $lines++;
  245.         }
  246.         
  247.         my $menu_items = @menu_list;
  248.         my $mlines = 15 - $lines;
  249.         my $items = ($menu_items > $mlines) ? $mlines : $menu_items;
  250.         my $default_item = '';
  251.         $default_item = "--default-item $default" if ($default ne '' and $dialog =~ /(^|\/)dialog/);
  252.         my $ret;
  253.  
  254.         if ($INPUTCOMMON_MENU == 1) {
  255.         $ret = menu_single($menu_text, $items, $default_item,
  256.                       @menu_list);
  257.         } else {
  258.         $ret = menu($menu_text, $items, $default_item, @menu_list);
  259.         }
  260.  
  261.         return '' if ($result != 0);
  262.         return $ret if ($ret ne $input_menu_item);
  263.     }
  264.     
  265.     chomp($input_text);
  266.     $input_text =~ s/\n/\\n/gm;
  267.  
  268.     $ret = inputbox($input_text, $default, $input_pattern,
  269.             $input_allowempty);
  270.     return $ret if ($result == 0 || $menu_text eq '');
  271.     }
  272. }
  273.  
  274. sub input_checklist {
  275.     my $input_text = shift;
  276.     my $default = shift;
  277.     my $input_pattern = shift;
  278.     my $input_allowempty = shift;
  279.     my $clist_text = '';
  280.     my @clist_list = ();
  281.     if (@_ > 0) {
  282.     $clist_text = shift;
  283.     @clist_list = @_;
  284.     }
  285.  
  286.     while (1) {
  287.     chomp($clist_text);
  288.     my $lines = 1;
  289.     while ($clist_text =~ /\n/m) {
  290.         $clist_text =~ s/\n/\\n/m;
  291.         $lines++;
  292.     }
  293.     
  294.     my $clist_items = @clist_list;
  295.     my $clines = 15 - $lines;
  296.     my $items = ($clist_items > $clines) ? $clines : $clist_items;
  297.     my $ret;
  298.     
  299.     $ret = checklist_single_onargs($clist_text, $items, $default,
  300.                        @clist_list);
  301.     return '' if ($result != 0);
  302.     chomp($ret);
  303.     $ret =~ s/\n/ /g;
  304.         
  305.     $ret = inputbox($input_text, $ret, $input_pattern, $input_allowempty);
  306.     return $ret if ($result == 0);
  307.     }
  308. }
  309.  
  310.  
  311. sub input_menu2 {
  312.     $INPUTCOMMON_MENU = 2;
  313.     my $ret = input_menu(@_);
  314.     $INPUTCOMMON_MENU = 1;
  315.     return $ret;
  316. }
  317.  
  318.  
  319.  
  320. 1;
  321.  
  322.